package com.fiveGroup.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fiveGroup.annotation.Log;
import com.fiveGroup.pojo.AdminUserNotice;
import com.fiveGroup.pojo.Category;
import com.fiveGroup.pojo.Product;
import com.fiveGroup.pojo.User;
import com.fiveGroup.pojo.vo.DataVo;
import com.fiveGroup.service.AdminUserNoticeService;
import com.fiveGroup.service.CategoryService;
import com.fiveGroup.service.ProductService;
import com.fiveGroup.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;

/**
 * ClassName: BackgroundProductController
 * Package:
 * Description
 * : 后台商品管理控制层
 * 提供商品列表查询和商品下架功能
 *
 * @Author wen
 * @Create 2025/9/30 10:56
 * @Version 1.0
 */
@RestController
@RequestMapping("/api/admin")
@RequiredArgsConstructor
@Slf4j
public class BackgroundProductController {

    private final ProductService productService;

    private final AdminUserNoticeService adminUserNoticeService;

    private final UserService userService;

    private final CategoryService categoryService;


    /**
     * 后台商品列表查询
     *
     * @param currentPage 当前页码，默认值为1
     * @param pageSize    每页显示的记录数，默认值为5
     * @param productName 商品名称（可选）
     * @param categoryId  分类ID（可选）
     * @param createdAt   创建时间（可选，格式：yyyy-MM-dd）
     * @param minPrice    最低价格（可选）
     * @param maxPrice    最高价格（可选）
     * @return 分页后的商品列表
     */
    @Log(action = "商品管理", detail = "查询商品列表")
    @GetMapping("/getProductList")
    public DataVo getProductList(@RequestParam(defaultValue = "1") int currentPage,
                                 @RequestParam(defaultValue = "5") int pageSize,
                                 @RequestParam(required = false) String productName,
                                 @RequestParam(required = false) String categoryId,
                                 @RequestParam(required = false) String createdAt,
                                 @RequestParam(required = false) String minPrice,
                                 @RequestParam(required = false) String maxPrice) {

        // 管理员权限验证
        // if (!isAdmin()) {
        //     return DataVo.fail("无权访问");
        // }

        // 对分页参数进行验证
        if (currentPage <= 0) {
            currentPage = 1;
        }
        if (pageSize <= 0 || pageSize > 100) {
            // 限制最大页面大小
            pageSize = 10;
        }


        IPage<Product> page = new Page<>(currentPage, pageSize);
        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();

        // 只查询审核通过的商品
        queryWrapper.eq(Product::getStatus, 1);
        // 根据商品名称、分类ID和创建时间进行模糊查询
        if (productName != null && !productName.isEmpty()) {
            queryWrapper.like(Product::getName, productName);
        }
        if (categoryId != null && !categoryId.isEmpty()) {
            try {
                Long catId = Long.parseLong(categoryId);
                // 检查分类ID是否存在
                Category category = categoryService.getById(catId);
                if (category != null) {
                    queryWrapper.eq(Product::getCategoryId, catId);
                } else {
                    return DataVo.fail("分类ID不存在");
                }
            } catch (NumberFormatException e) {
                return DataVo.fail("分类ID格式错误");
            }
        }
        if (createdAt != null && !createdAt.isEmpty()) {
            try {
                // 将字符串转换为 LocalDate
                LocalDate date = LocalDate.parse(createdAt);
                // 设置查询范围：从当天的开始时间到结束时间
                queryWrapper.ge(Product::getCreatedAt, date.atStartOfDay())
                        .lt(Product::getCreatedAt, date.plusDays(1).atStartOfDay());
            } catch (Exception e) {
                // 如果日期格式不正确，可以记录日志或返回错误信息
                log.warn("日期格式不正确: {}", createdAt);
            }
        }
        // 对价格参数进行范围验证
        if (minPrice != null && !minPrice.isEmpty()) {
            try {
                Double min = Double.parseDouble(minPrice);
                if (min < 0) {
                    return DataVo.fail("最低价格不能为负数");
                }
                queryWrapper.ge(Product::getPrice, min);
            } catch (NumberFormatException e) {
                return DataVo.fail("最低价格格式错误");
            }
        }
        if (maxPrice != null && !maxPrice.isEmpty()) {
            try {
                Double max = Double.parseDouble(maxPrice);
                queryWrapper.le(Product::getPrice, max);
            } catch (NumberFormatException e) {
                return DataVo.fail("最高价格格式错误");
            }
        }
        IPage<Product> productIPage = productService.page(page, queryWrapper);

        return DataVo.success(productIPage);
    }


    /**
     * 后台商品下架
     *
     * @param productInfo 包含商品ID和下架原因的Product对象
     * @return 操作结果
     */
    @Log(action = "商品管理", detail = "商品下架")
    @PutMapping("/unList")
    public DataVo unListProduct(@RequestBody Product productInfo) {
        // 管理员权限验证
        // if (!isAdmin()) {
        //     return DataVo.fail("无权执行此操作");
        // }

        // 获取商品信息
        Product product = productService.getById(productInfo.getId());
        if (product == null) {
            return DataVo.fail("商品不存在");
        }
        // 检查商品是否已经是下架状态
        if (product.getStatus() == 0) {
            return DataVo.fail("商品已经是下架状态");
        }
        // 检查商品是否正在审核中
        if (product.getStatus() == 2) {
            return DataVo.fail("商品正在审核中，无法下架");
        }
        // 检查商品是否已售出
        if (product.getStatus() == 3) {
            return DataVo.fail("商品已售出，无法下架");
        }

        // 更新商品状态为下架
        product.setStatus(0);
        product.setAuditStatus(2);
        product.setAuditRemark(productInfo.getAuditRemark());
        boolean updated = productService.updateById(product);

        if (!updated) {
            return DataVo.fail("商品下架失败");
        }

        // 发送通知给卖家（可以是不同的通知内容）
        try {
            Long sellerId = product.getSellerId();
            if (sellerId != null) {
                // 获取卖家信息
                User seller = userService.getById(sellerId);
                if (seller != null) {
                    //获取当前管理员ID
//                    Long adminId = UserContextHolder.getUserId();
                    //假设当前管理员ID为1，实际应用中应从上下文获取
                    Long adminId = 1L;
                    // 创建通知记录
                    AdminUserNotice notice = new AdminUserNotice();
                    notice.setAdminId(adminId);
                    notice.setTitle("商品下架通知");
                    notice.setContent("您的商品 " + product.getName() + "因" + product.getAuditRemark() + "已被管理员下架。");
                    notice.setTargetUserId(sellerId);
                    notice.setCreatedAt(LocalDate.now());
                    // 保存通知记录
                    adminUserNoticeService.save(notice);
                }
            }
        } catch (Exception e) {
            log.error("发送下架通知失败", e);
            // 即使通知发送失败，也认为下架操作成功
        }

        // 记录管理员操作日志
        // logAdminAction("下架商品", "商品ID: " + id);

        return DataVo.success("商品下架成功");
    }

}
